热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PerlOneLiners|Perl命令行学习5$/和$\变量

Perl特殊变量$和$\上集回顾上次我们看了一下-M与-I这两个搭档这次我们来看看这两个特殊的”变量“$和$\,不是参数。解释$:输入记录分隔符$\:输出记录分隔符说实话,这两个符
Perl 特殊变量$/$\

上集回顾

上次我们看了一下-M-I这两个搭档
这次我们来看看这两个特殊的”变量“$/$\,不是参数。

解释

$/ : 输入记录分隔符
$\ : 输出记录分隔符

说实话,这两个符号的确是有些诡异!可以这么来记,“太阳出来我爬山坡,爬上山坡我好唱歌”,爬坡的是/(入),下坡的是\(出)。

这两个变量是特殊变量,什么意思呢?就是它们是从娘胎里来的,本来就有,不需要你去声明,它们就在那里。

为什么要说这两个变量呢?这两个变量是什么意思呢?下面先说明一下这两个奇特的怪物究竟是个什么玩意。

比如在工厂车间的流水线,生产罐头的那种。
[] [] [] [] [] [] [] [] [] [] [] []
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->
| O O O O O O O O O O O O O O O O |
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<-
当得到成品罐头之后,需要装箱了,可是多少个装一箱呢。
这个时候就有机器负责控制履带移动的长度来控制几个罐头为一组进行装箱(罐头之间间距相等)。
比如4个罐头装一箱,那好,当过了一定长度之后传送带停下来,机械臂将4个罐头装箱,OK
|===================
-
| |
|
[] [] [] [] [] [] [] [] [] [] [] []
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->
| O O O O O O O O O O O O O O O O |
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<-
下一批
|===================
- ---------
| | | [] [] |
| | [] [] |
[] [] [] [] [] [] [] [] ---------
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->--> ####################
| O O O O O O O O O O O O O O O O | ####################
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<- ####################
再下一批
|===================
- --------- ---------
| | | [] [] | | [] [] |
| | [] [] | | [] [] |
[] [] [] [] --------- ---------
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->--> ####################
| O O O O O O O O O O O O O O O O | ####################
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<- ####################

假如我的包装箱变大了,这次要装6个,怎么搞,好办,设置一下传送带每次传送的长度就OK可
|=================== ---------
- | [] [] |
| | | [] [] |
| | [] [] |
[] [] [] [] [] [] ---------
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->--> ####################
| O O O O O O O O O O O O O O O O | ####################
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<- ####################

有的时候厂家搞活动,在箱子里面除了有罐头,还有小礼品哟。
---------
| [] [] |--| +++
| [] [] | | +++ 小礼品,比如杯子,哈哈
| [] [] | +++
--------- +++
^^^^^^^^^^
||||||||||
上面是一个装罐头的箱子,外面用绳子系了个礼物在外面,我怕我灵魂画手的功力太深,你们认不出来~~

这里不妨把perl的文本处理流程当作是工厂中的流水线,每次读取一“行”,来处理。

  • $/就是说在什么地方将文本分隔开来作为一组”罐头“,类似于控制传送带移动的长度。
  • $\就是当我想打印文本的时候后面带的小尾巴是什么,就像是上面的小礼品一样。

现实世界与机器世界

《Perl One-Liners | Perl命令行学习5 $/和$\变量》 现实世界.JPG

《Perl One-Liners | Perl命令行学习5 $/和$\变量》 机器世界.JPG

平常我们读书,从左到右转头就是一行。但是在机器世界,究竟什么是“行”,其实计算机的存储是连续的,并不是说想现实世界那样还转行之类的。那么究竟是如何区分行与行呢?
比如有一段序列

ATGCGTAGCTA
TAGCTAGCTTG
AA

其实真实的是这样的

ATGCGTAGCTA\nTAGCTAGCTTG\nAA

当然了,更加还原是以1和0表示,这里为了方便叙述。也就是说在这三“行”序列之间是用一个\n连起来的,并不是像现实世界转头之类的。机器为了区分,每次读到\n,就知道了到了一“行”了。
上面两张图说明了现实的书本纸和机器世界的区别LF就是指\n。这个就是为了告诉机器要“换行了”。那么这里Perl不仅可以要机器在\n的地方换行,也可以自己设置如果碰到什么字符那就换行,比如!~@等等。

我之前有一个同学在处理文本的时候没有将末尾的那个不可见的换行符去除,导致正则表达式无法匹配,也就无法得到正确结果,但是他换成从命令行输出那一行信息却可以匹配(从命令行读取的不包含换行符)。一直纠结,后来我给他说了,他一直不相信,知道后来事实证明他没搞清楚这个换行符。

额,可能被我搞的糊涂了,来看看例子就明白啦!

用法

$/ = "\n";
$\ = "\n";

这两个就是变量,也就是说可以直接对他们赋值

实例

  • 示例1

# 这次不用-a与-F参数来处理
echo "12-34-56,45-23-67,678-56-12" | perl -n -e '
BEGIN{
# 在读取数据之前就设置好输入记录分隔符
# 设置 , 作为“一行”的结尾的标志
$/ = ",";
}
# 在将读取的每一“行”的一系列用 - 连起来的数值进行分隔
my @list = split /-/,$_;
# 对每组数值求和
my $total = 0; # 初始化变量
for my $num (@list){
$total += $num;
}
print "$total\n";
'
# 输出
102
135
746

这里来解释一下

| |
v v
12-34-56,45-23-67,678-56-12

箭头所指的就是每次读取的”一行“的停止位置,平常我们一般都是认为换行符才是一行的末尾,但是这里$/大哥说了,机器人的世界中的天上天下的——换行,都归我管 。也就是说这里它重新定义了行的概念,就是说,按照,来作为标志。比如

机器读
12-34-56,
这是”一行“
再读
45-23-67,
这是”一行“
在读
678-56-12
这是”一行“

这里的“行”是指机器读的行

来点实际的东西

  • 示例2

假如有一个文件123.txt,内容为

>atp1
AGTCAGCTGACTCGATCTACGTCTAGCGACGT
GATACGTACGTACGGTACTCGTAGCTACCGTA
TAGTAGC
>cox
ATGCGTAGCTATCGTAGCTAGCTCGATCGTCA
AGTAGCTCAGG
>nad1
ATGCTAGCTGACTTGACTGCATACGATGCTAG
GTAGTCATGCTAGCTAGC

其实在平常我们碰到很多fasta文件,它的序列是按照80个碱基为一行就进行了换行了,所以我们后续处理有些麻烦。比如我们想要得到名为atp1的序列,那么就是当我判断了到了atp1之后,接下来就是序列,可是只打印出>atp1下面的一行却不是它的完整序列,还需要继续打印,直到碰到>cox,这样其实某种程度上来说就有点不太方便。

怎么做呢?你根据今天说的内容应该想出来怎么办了吧!

# 使用 > 作为输入分隔符
# 代码如下
cat 123.txt | perl -n -e '
BEGIN{
$/ = ">";
}
# 由于是以 > 作为分隔符,那么尾巴处就可能有>符号(除了最后一行可能没有其他都有)
$_ =~ s/>$//; # 正则表达式中\s*\r*使因为不只知道在atp1后面是否有空格和回车符,所以加上
if($_ =~ m/^atp1\s*\r*\n/){
# 1. 也可以在这里除去里面的换行符
# print (substr($_,length($&)) =~ s/\r*\n//gr);
# 2. 也可以不去除
print ( substr($_,length($&) );
}
'
# 输出为
AGTCAGCTGACTCGATCTACGTCTAGCGACGT
GATACGTACGTACGGTACTCGTAGCTACCGTA
TAGTAGC

这里我把分隔出来的每一批字符写一下

  1. 第一批

>

  1. 第二批

atp1
AGTCAGCTGACTCGATCTACGTCTAGCGACGT
GATACGTACGTACGGTACTCGTAGCTACCGTA
TAGTAGC
>

  1. 第三批

cox
ATGCGTAGCTATCGTAGCTAGCTCGATCGTCA
AGTAGCTCAGG
>

  1. 第四批

nad1
ATGCTAGCTGACTTGACTGCATACGATGCTAG
GTAGTCATGCTAGCTAGC

注意:由于这里我们对机器世界的行进行了重新定义,在这每一“行”中就可能存在多个\n,而“行”的结尾就变成了>

$\

这个参数就是说当输出的时候,在输出的内容后带上一个小尾巴
比如

perl -e '
BEGIN{
$\ = "~";
}
for my $num (1..10){
print "$num";
}
'
# 输出
1~2~3~4~5~6~7~8~9~10~

就是说每次print,都会在print的内容后面加上$\指定的内容,这里是否想到减少按键盘的次数了。将$\赋值为\n。你自己多试一试哦。

后记

这一次并没有说参数相关的,而是说了这两个怪物,其实从第一篇再到这个第五篇,顺序是按照我个人认为的重要程度来述说的,有点主观啊!但是要是写的话就是说如果有一根线穿连着会不会更加有效一些。因为Perl特别擅长文本处理,而涉及到文本就不得不牵扯到换行啦,打印啦之类的。而这两个特殊变量就是与之相关的,虽然怪异但是这两个变量的确好用。对了,上面的例子都是搭配BEGIN{}和END{}搭配进行的全局的分隔符的设置,其实有时候可以使用local $/ = ">"local $\ = "\n",之类的写法来在局部块中进行设置。

相关

有关BEGIN{}END{}的说明已经在之前的内容中提到了。可以参见

  • perl命令行 -a与 -F参数
  • Perl命令行 -M与-I参数

引用

简笔画技法从新手到高手


推荐阅读
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • 本文详细介绍了Oracle数据库中的表空间及其分区技术。表空间作为Oracle数据库的一个逻辑单元,每个数据库可包含一个或多个表空间,每个表空间则关联一个或多个数据文件。通过合理的表空间管理和分区策略,可以显著提升数据库的性能和管理效率。文章还总结了实际应用中的最佳实践,为读者提供了宝贵的参考。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本文探讨了利用Python实现高效语音识别技术的方法。通过使用先进的语音处理库和算法,本文详细介绍了如何构建一个准确且高效的语音识别系统。提供的代码示例和实验结果展示了该方法在实际应用中的优越性能。相关文件可从以下链接下载:链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ,提取码:p57s。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文详细介绍了 Python 中字符串处理的各种技巧,包括查找、复制、替换、删除、截取、连接、比较、包含检测及大小写转换等操作。特别强调了如何使用 `strip()`、`lstrip()` 和 `rstrip()` 方法去除字符串中的空格和特殊符号,以及如何通过简单的赋值语句实现字符串的复制。此外,还提供了丰富的示例代码,帮助读者更好地理解和应用这些技巧。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
author-avatar
pS看云梦山水Tn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有